记录了redis dump相关的知识点。
在做自动化测试的时候,一般的error可以通过log来复现,但是比较复杂的case,需要用到更多的定位信息。这时候需求是dump app中用到的redis数据,来分析结果。故研究了下redis dump相关知识。
需求分析
需求拆分下,其实是:
- 如何dump redis当前数据
- 如何通过dump文件,恢复数据的读取
更细化的一些场景是:
- 能否指定dump文件存放位置?
- dump文件权限需要用户什么权限?
- 能否dump指定key或者指定的几个key?
针对上面的需求,看了下redis官方文档,其中几个关键点如下:
- redis是有多个db的,dump的时候选对db
- redis dump无法指定文件位置,使用默认($dir下);故多次dump相同实例会覆盖
- redis stop会默认dump,故需要先stop再覆盖dump.rdb,否则是无法加载dump数据的
- redis-cli有两种模式
- command,如redis-cli incr mycounter
- inactive,交互模式,只输入redis-cli可进入。这里比较坑的地方是使用fabric运行shell的时候,会进入交互模式的问题:戳这里
OK,关键点如上,下面会列举具体的步骤:
dump步骤
dump redis
涉及fabric相关的脚本的部分,并不在本文介绍中,可以参考:
# fab脚本中,dump redis的fun
def do_redis_dump():
run('save | redis-cli')
这个写法很有意思,一开始测试时,脚本是redis-cli && save
,但是这种方式会进入redis-cli的inactive模式,脚本会block在输入,故采用了上述方式。
def download_redis_dump_file(redis_file_dir):
get('/var/lib/redis/dump.rdb',redis_file_dir)
这一步是download了对应的脚本
有了dump.rdb之后,dump就算完成了。下面需要的是启动一个redis并load已经dump好的文件,一般有如下两种情况:
reload redis
- case 1:没运行redis实例/现有redis实例,但是数据不重要。故找到dump.rdb位置,替换文件,并systemctl restart redis即可
- case 2:已经有现有的redis实例且不能restart/数据有用,需要启动额外的redis实例来加载该dump.rdb
case 1
针对case1,可能需要的是找到现有redis的dump file的位置,具体为:
127.0.0.1:6379> config get dir
1) "dir"
2) "/var/lib/redis"
由上可知,redis路径为/var/lib/redis,其dump file如下:
[root@test-214 system]# cd /var/lib/redis/
[root@test-214 redis]# ll
total 8
drwxr-xr-x. 2 root root 4096 May 22 01:36 6380
-rw-r--r--. 1 redis redis 18 May 19 07:20 dump.rdb
reload的步骤为:
- systemctl stop redis
- cp new-dump-file old-dump-file
- systemctl start redis
即可使用redis-cli查看dump file中的数据
case 2
case 2本质与case 1相同,只不过需要启动一个额外的redis实例,涉及到的修改有:
- 需要cp一份redis.conf并修改其中内容
- 使用新的redis.conf来启动服务
复制配置文件
cp /etc/redis.conf /etc/redis/redis_6380.conf
mkdir /var/lib/redis/6380/
vim /etc/redis/redis_6380.conf修改配置文件中内容
- pidfile /var/run/redis.pid
- port 6379
- logfile /var/log/redis.log
- dir /var/lib/redis/
to
- pidfile /var/run/redis_6380.pid
- port 6380
- logfile /var/log/redis/redis_6380.log
- dir /var/lib/redis/6380
启动新的实例
nohup /usr/bin/redis-server /etc/redis/redis_6380.conf
后续操作参考case 1的步骤即可。
FAQ
- Unknown RDB format version: 7 (redis-check-rdb)
- 查看redis rdb文件版本:文件格式说明